/**
 * map 也就是大部分语言中具有的类型，中文称为映射表
 * 内部的实现并没有什么本质的区别：一个数组或者类似数组的东西，加上一堆方法。
 * 根据具体的情况，可以细分为许多子类型的映射表，就好像java那样
 * 
 * 一、哈希映射表的定义/创建
 *    1.所有键的类型必须一致，所有值的类型必须是一致，这和java是大不一样的。  rust应该也有和java对应的，但应该不是哈希映射表
 * 
 * 二、映射表的基本操作
 * 
 * 三、映射表的一些特殊操作
 * 
 * 四、映射表的一些特殊操作
 * 
 * 五、映射表的小结
 * 
 */
use std::collections::HashMap;
use std::any::type_name;
fn print_type_of<T>(_: &T) {
    println!("The type is: {}", type_name::<T>());
}
fn main(){

    let mut family=HashMap::new();
    family.insert(String::from("父亲"),"lzf");
    family.insert(String::from("母亲"),"hxl");
    family.insert(String::from("女儿"),"lml");
    family.insert(String::from("男儿"),"lql");

    println!("{:?}",&family);

    let mut  sun=Vec::new();sun.push("阿大");sun.push("阿二");
    //family.insert(String::from("孙辈"),sun);  //这样是会报错的
    //println!("{:?}",&family);
    println!("{:#?}",&family); //更好的格式

    let mut scores=HashMap::new();
    let g_bad:String=String::from("差");
    let g_mid:String=String::from("中");
    let g_good:String=String::from("良");
    let g_excellent:String=String::from("优");
    let g_perfect:String=String::from("完美");

    scores.insert(String::from("101"),g_bad);   //g_bad被夺取所有权了
    scores.insert(String::from("102"),g_mid);
    scores.insert(String::from("103"),g_excellent);
    scores.insert(String::from("104"),g_good);
    scores.insert(String::from("105"),g_perfect);
    println!("{:#?}",&scores);

    println!("get方法会返回一个不可修改的对象");
    let s103=scores.get("103"); //返回的是一个Option
    println!("103的成绩:{}",s103.unwrap());
    //s103=Some(&String::from("说不清"));  // 这是不可修改，会报错
    let s106=scores.get("106"); //访问一个不存在，会返回None
    println!("106的成绩:{}",s106.unwrap_or(&String::from("不存在")));

    let  mut_s104=scores.get_mut("104");
    print_type_of(&mut_s104);
    println!("现在104的成绩:{}",mut_s104.unwrap());
    
    //println!("{}",g_bad); //g_bad被夺取所有权了，所以这里会报错的    
    print_hm_use_forkv(&scores);
    print_hm_use_forvalues(&scores);
}

fn print_hm_use_forkv(hm:&HashMap<String,String>){
    for (k,v) in hm{
        println!("{}:{}",k,v);
    }
}

fn print_hm_use_forvalues(hm:&HashMap<String,String>){
    for value in hm.values() {
        println!("{}",value);
    }
}